﻿using System;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessEntity
{
    /// <summary>
    /// Entidade de verificação de políticas de corretagem
    /// </summary>
    public class VerificacaoPolitica : BaseBusinessEntity
    {
        #region Atributos

        private const int RSCODIGOPOLITICA = 109541;
        private const int RSDATAINICIAL = 109542;
        private const int RSOPERADOR = 109563;
        private const int RSMERCADO = 109564;

        private int? _codigoPolitica;
        private DateTime? _dataInicial;
        private int? _codigoOperador;
        private int? _codigoAssessor;
        private int? _codigoAgente;
        private BusinessEntity.Enum.TipoMercado? _mercado;
        private int? _carteira;
        private string _ativo;
        private int? _codigoTabelaPadrao;
        private int? _codigoTabelaBeneficio;
        private Enum.NaturezaOperacao? _naturezaOperacao;
        private BusinessEntity.TipoOperacaoVerificacao _tipoOperacao;
        private Enum.AcaoVerificacaoPolitica _acao;

        #endregion

        #region Construtores

        /// <summary>
        /// Contrutor VerificacaoPolitica
        /// </summary>
        public VerificacaoPolitica() { }

        /// <summary>
        /// Contrutor VerificacaoPolitica
        /// </summary>
        /// <param name="acao"></param>
        /// <param name="ativo"></param>
        /// <param name="carteira"></param>
        /// <param name="codigoAgente"></param>
        /// <param name="codigoAssessor"></param>
        /// <param name="codigoOperador"></param>
        /// <param name="codigoPolitica"></param>
        /// <param name="codigoTabelaBeneficio"></param>
        /// <param name="codigoTabelaPadrao"></param>
        /// <param name="dataInicial"></param>
        /// <param name="mercado"></param>
        /// <param name="naturezaOperacao"></param>
        /// <param name="tipoOperacao"></param>
        public VerificacaoPolitica(Enum.AcaoVerificacaoPolitica acao, string ativo, int? carteira, int? codigoAgente, int? codigoAssessor, int? codigoOperador,
                                   int? codigoPolitica, int? codigoTabelaBeneficio, int? codigoTabelaPadrao, DateTime? dataInicial, BusinessEntity.Enum.TipoMercado? mercado,
                                   Enum.NaturezaOperacao? naturezaOperacao, BusinessEntity.TipoOperacaoVerificacao tipoOperacao) { }

        #endregion

        #region Propriedades

        /// <summary>
        /// Código da política de corretagem
        /// </summary>
        [NotNull(RSCODIGOPOLITICA)]
        public int? CodigoPolitica
        {
            get
            {
                return _codigoPolitica;
            }
            set
            {
                _codigoPolitica = value;
            }
        }

        /// <summary>
        /// Data Inicial da vigência da política de corretagem
        /// </summary>
        [NotNull(RSDATAINICIAL)]
        public DateTime? DataInicial
        {
            get
            {
                return _dataInicial;
            }
            set
            {
                _dataInicial = value;
            }
        }

        /// <summary>
        /// Código do operador
        /// </summary>
        [NotNull(RSOPERADOR)]
        public int? CodigoOperador
        {
            get
            {
                return _codigoOperador;
            }
            set
            {
                _codigoOperador = value;
            }
        }

        /// <summary>
        /// Código do assessor
        /// </summary>
        public int? CodigoAssessor
        {
            get
            {
                return _codigoAssessor;
            }
            set
            {
                _codigoAssessor = value;
            }
        }

        /// <summary>
        /// Código do agente
        /// </summary>
        public int? CodigoAgente
        {
            get
            {
                return _codigoAgente;
            }
            set
            {
                _codigoAgente = value;
            }
        }

        /// <summary>
        /// Mercado
        /// </summary>
        [NotNull(RSMERCADO)]
        [NotEmpty(RSMERCADO, true)]
        public BusinessEntity.Enum.TipoMercado? Mercado
        {
            get
            {
                return _mercado;
            }
            set
            {
                _mercado = value;
            }
        }

        /// <summary>
        /// Carteira
        /// </summary>
        public int? Carteira
        {
            get
            {
                return _carteira;
            }
            set
            {
                _carteira = value;
            }
        }

        /// <summary>
        /// Ativo (ISIN)
        /// </summary>
        public string Ativo
        {
            get
            {
                return _ativo;
            }
            set
            {
                _ativo = value;
            }
        }

        /// <summary>
        /// Código da tabela padrão de corretagem
        /// </summary>
        public int? CodigoTabelaPadrao
        {
            get
            {
                return _codigoTabelaPadrao;
            }
            set
            {
                _codigoTabelaPadrao = value;
            }
        }

        /// <summary>
        /// Código da tabela de corretagem de benefício
        /// </summary>
        public int? CodigoTabelaBeneficio
        {
            get
            {
                return _codigoTabelaBeneficio;
            }
            set
            {
                _codigoTabelaBeneficio = value;
            }
        }

        /// <summary>
        /// Natureza da operação
        /// </summary>
        public Enum.NaturezaOperacao? NaturezaOperacao
        {
            get
            {
                return _naturezaOperacao;
            }
            set
            {
                _naturezaOperacao = value;
            }
        }

        /// <summary>
        /// Tipo de operação de verificação
        /// </summary>
        public BusinessEntity.TipoOperacaoVerificacao TipoOperacao
        {
            get
            {
                return _tipoOperacao;
            }
            set
            {
                _tipoOperacao = value;
            }
        }

        /// <summary>
        /// Ação a ser tomada no momento da atualização da entidade
        /// </summary>
        public Enum.AcaoVerificacaoPolitica Acao
        {
            get
            {
                return _acao;
            }
            set
            {
                _acao = value;
            }
        }

        #endregion
    }
}